// 数据库使用示例
// 演示如何使用 SurrealDB 存储和查询期权数据

use akoption::db::{DbConfig, OptionStore};
use akoption::*;
use std::path::PathBuf;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 初始化日志
    tracing_subscriber::fmt::init();
    
    println!("=== AKOption 数据库示例 ===\n");
    
    // 1. 创建数据库配置
    let config = DbConfig::new(
        PathBuf::from("./data/example.db"),
        "akoption",
        "options"
    );
    
    println!("数据库路径: {}", config.path.display());
    println!("命名空间: {}", config.namespace);
    println!("数据库名: {}\n", config.database);
    
    // 2. 创建数据存储实例
    println!("连接数据库...");
    let store = OptionStore::new(config).await?;
    println!("✓ 数据库连接成功\n");
    
    // 3. 获取并存储东方财富期权数据
    println!("获取东方财富期权数据...");
    let em_data = option_current_em().await?;
    println!("✓ 获取到 {} 条期权数据", em_data.len());
    
    println!("存储数据到数据库...");
    store.save_em_options(&em_data).await?;
    println!("✓ 数据存储成功\n");
    
    // 4. 查询数据
    println!("查询所有期权数据...");
    let all_options = store.query_em_options(None).await?;
    println!("✓ 查询到 {} 条记录", all_options.len());
    
    if let Some(first) = all_options.first() {
        println!("\n示例数据:");
        println!("  代码: {}", first.code);
        println!("  名称: {}", first.name);
        println!("  最新价: {:?}", first.last);
        println!("  涨跌额: {:?}", first.change);
    }
    
    // 5. 查询特定期权
    if let Some(first) = em_data.first() {
        println!("\n查询特定期权: {}", first.code);
        let specific = store.query_em_options(Some(&first.code)).await?;
        println!("✓ 查询到 {} 条记录", specific.len());
    }
    
    // 6. 获取并存储价值分析数据
    println!("\n获取期权价值分析数据...");
    let value_data = option_value_analysis_em().await?;
    println!("✓ 获取到 {} 条价值分析数据", value_data.len());
    
    println!("存储价值分析数据...");
    store.save_value_analysis(&value_data).await?;
    println!("✓ 价值分析数据存储成功");
    
    // 7. 获取并存储风险分析数据
    println!("\n获取期权风险分析数据...");
    let risk_data = option_risk_analysis_em().await?;
    println!("✓ 获取到 {} 条风险分析数据", risk_data.len());
    
    println!("存储风险分析数据...");
    store.save_risk_analysis(&risk_data).await?;
    println!("✓ 风险分析数据存储成功");
    
    // 8. 统计信息
    println!("\n=== 数据库统计 ===");
    let em_count = store.count_records("em_options").await?;
    println!("东方财富期权: {} 条", em_count);
    
    let value_count = store.count_records("value_analysis").await?;
    println!("价值分析: {} 条", value_count);
    
    let risk_count = store.count_records("risk_analysis").await?;
    println!("风险分析: {} 条", risk_count);
    
    // 9. 自定义查询示例
    println!("\n=== 自定义查询示例 ===");
    
    // 查询最新价大于 1.0 的期权
    let query = "SELECT * FROM em_options WHERE last > 1.0 LIMIT 5";
    let high_price: Vec<serde_json::Value> = store.query(query).await?;
    println!("最新价 > 1.0 的期权: {} 条（显示前5条）", high_price.len());
    
    // 10. 获取并存储上交所合约数据
    println!("\n获取上交所期权合约列表...");
    let sse_contracts = option_sse_list_sina().await?;
    println!("✓ 获取到 {} 个合约", sse_contracts.len());
    
    println!("存储上交所合约数据...");
    store.save_sse_contracts(&sse_contracts).await?;
    println!("✓ 合约数据存储成功");
    
    let sse_count = store.count_records("sse_contracts").await?;
    println!("上交所合约: {} 条", sse_count);
    
    println!("\n=== 示例完成 ===");
    println!("数据已保存到: {}", store.config().path.display());
    
    Ok(())
}
